home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1998 / MacHack 1998.toast / Sessions / Completions / Presentation Code / SimplifiedFileCopier.cp < prev   
Text File  |  1998-06-19  |  2KB  |  134 lines

  1.  
  2. class FileCopier
  3.   {
  4.     private:
  5.         const FSSpec *sourceFile;
  6.         const FSSpec *destinationFile;
  7.  
  8.         FileReadingPath sourcePath;
  9.         FileWritingPath destinationPath;
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.         
  21.         FileCreator create;
  22.         FileOpener open;
  23.         FileCloser close;
  24.         FileInStream inStream;
  25.         FileOutStream outStream;
  26.         
  27.         InputPump pumpIn;
  28.         OutputPump pumpOut;
  29.         Race2 race;
  30.         
  31.         uint8 buffer[1024 * 1024 + 4096];
  32.         Pipe pipe;
  33.         
  34.         TaskSequencer<FileCopier> sequence;
  35.         typedef TaskStep<FileCopier> Step;
  36.  
  37.         
  38.  
  39.  
  40.         Step CreateDestination( bool dying, DeferredTaskTime );
  41.         Step OpenDestinationData( bool dying, DeferredTaskTime );
  42.         Step OpenSourceData( bool dying, DeferredTaskTime );
  43.  
  44.         Step CopyData( bool dying, DeferredTaskTime );
  45.  
  46.         Step CloseSourceData( bool dying, DeferredTaskTime );
  47.         Step CloseDestinationData( bool dying, DeferredTaskTime );
  48.         
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.     public:
  60.         FileCopier();
  61.         
  62.         Task *operator()( const FSSpec& source,
  63.                                 const FSSpec& destination );
  64.   };
  65.  
  66.  
  67.  
  68. Task *FileCopier::operator()( const FSSpec& source,
  69.                                         const FSSpec& destination )
  70.   {
  71.     sourceFile = &source;
  72.     destinationFile = &destination;
  73.     return sequence.Start( Step( 0, &FileCopier::CreateDestination ) );
  74.   }
  75.  
  76.  
  77.  
  78. TaskStep<FileCopier> FileCopier::CreateDestination( bool, DeferredTaskTime )
  79.   {
  80.     return Step( create( *destinationFile ),
  81.                      &FileCopier::OpenDestinationData );
  82.   }
  83.  
  84. TaskStep<FileCopier> FileCopier::OpenDestinationData( bool, DeferredTaskTime )
  85.   {
  86.     return Step( open.OpenDataFork( *destinationFile,
  87.                                               destinationPath ),
  88.                      &FileCopier::OpenSourceData );
  89.   }
  90.  
  91. TaskStep<FileCopier> FileCopier::OpenSourceData( bool, DeferredTaskTime )
  92.   {
  93.     return Step( open.OpenDataFork( *sourceFile, sourcePath ),
  94.                      &FileCopier::CopyData );
  95.   }
  96.  
  97. TaskStep<FileCopier> FileCopier::CopyData( bool, DeferredTaskTime )
  98.   {
  99.     pipe.Reset();
  100.     outStream.SetFile( destinationPath );
  101.     inStream.SetFile( sourcePath );
  102.     
  103.     inStream.SuggestNoCaching();
  104.     outStream.SuggestNoCaching();
  105.  
  106.     return Step( race( pumpIn( inStream, pipe.In() ),
  107.                              pumpOut( pipe.Out(), outStream ),
  108.                              1 ),
  109.                      &FileCopier::CloseSourceData );
  110.   }
  111.  
  112.  
  113.  
  114.  
  115.  
  116. TaskStep<FileCopier> FileCopier::CloseSourceData( bool, DeferredTaskTime )
  117.   {
  118.     return Step( close( sourcePath ),
  119.                      &FileCopier::CloseDestinationData );
  120.   }
  121.  
  122. TaskStep<FileCopier> FileCopier::CloseDestinationData( bool, DeferredTaskTime )
  123.   {
  124.     return Step( close( destinationPath ) );
  125.   }
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.